package com.apache.common.util;

import java.math.BigDecimal;

/**
 * description:  统一处理类（处理大数值）
 */
public class BigDecimalUtil {

	private static BigDecimalUtil instance;

	private BigDecimalUtil() {
	}

	public void init() {
		instance = this;
	}

	public static BigDecimalUtil getInstance() {
		if (null == instance) {
			instance = new BigDecimalUtil();
		}
		return instance;
	}

	/**
	 * 获取一个BigDecimal对象
	 * @param value 整数 int类型
	 * @return
	 */
	public BigDecimal getBigDecimal(int value) {

		return new BigDecimal(value);
	}

	/**
	 * 获取一个BigDecimal对象
	 * @param value 长整数
	 * @return
	 */
	public BigDecimal getBigDecimal(long value) {

		return new BigDecimal(value);
	}

	/**
	 * 获取一个BigDecimal对象 (double有精度问题，不建议使用此方法)
	 * @param value 双精度数值
	 * @return
	 */
	public BigDecimal getBigDecimal(double value) {

		return new BigDecimal(value);
	}

	/**
	 * 获取一个BigDecimal对象
	 * @param value 数值型字符串
	 * @return
	 */
	public BigDecimal getBigDecimal(String value) {

		return new BigDecimal(value);
	}

	public long getBigDecimalLong(String value) {
		return new BigDecimal(value).longValue();
	}

	public int getBigDecimalInt(String value) {
		return new BigDecimal(value).intValue();
	}

	public double getBigDecimalDouble(String value) {
		return new BigDecimal(value).doubleValue();
	}

	public double getBigDecimalDouble(String value, int scale) {
		BigDecimal b = new BigDecimal(value);
		b = b.setScale(2, BigDecimal.ROUND_HALF_UP); //小数位 直接舍去
		return b.doubleValue();
	}

	/**
	 * BigDecimal对象转换为字符
	 * @param value
	 * @return
	 */
	public String bigDecimalToStr(BigDecimal value) {

		return String.valueOf(value);
	}

	/**
	 * 两数相加
	 * @param v1 被加数
	 * @param v2 加数
	 * @return 两数的和
	 */
	public BigDecimal add(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		return bd1.add(bd2);
	}

	public BigDecimal add(BigDecimal v1, BigDecimal v2, int scale) {
		return v1.add(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 两数的差
	 * @param v1 被减数
	 * @param v2 减数
	 * @return 两数的差
	 */
	public BigDecimal subtract(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		return bd1.subtract(bd2);
	}

	public BigDecimal subtract(BigDecimal v1, BigDecimal v2, int scale) {
		return v1.subtract(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 两数相乘
	 * @param v1 被乘数
	 * @param v2 乘数
	 * @return 两数的积
	 */
	public BigDecimal multiply(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		return bd1.multiply(bd2);
	}

	public BigDecimal multiply(BigDecimal v1, BigDecimal v2, int scale) {
		return v1.multiply(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 两数相除
	 * @param v1 被除数 
	 * @param v2  除数
	 * @return 两数的商
	 */
	public BigDecimal divide(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		return bd1.divide(bd2);
	}

	/**
	 * 两数相除
	 * @param v1 被除数 
	 * @param v2  除数
	 * @param scale 保留小数位数
	 * @return 两数的商（保留指定小数位）
	 */
	public BigDecimal divide(String v1, String v2, int scale) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP);
	}

	public BigDecimal divide(BigDecimal v1, BigDecimal v2, int scale) {
		return v1.divide(v2, scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 四舍五入
	 * @param val 数值
	 * @param scale 保留小数位数
	 * @return
	 */
	public BigDecimal roundHalfUp(String val, int scale) {
		BigDecimal bd1 = new BigDecimal(val);
		return bd1.setScale(scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * 判断相等
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean eq(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		if (bd1.compareTo(bd2) == 0) {
			return true;
		} else {
			return false;
		}
	}

	public boolean eq(BigDecimal v1, BigDecimal v2) {
		if (v1.compareTo(v2) == 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 判断不相等
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean ne(String v1, String v2) {
		return !eq(v1, v2);
	}

	public boolean ne(BigDecimal v1, BigDecimal v2) {
		return !eq(v1, v2);
	}

	/**
	 * 判断第一个数大于第二个数
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean gt(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		if (bd1.compareTo(bd2) == 1) {
			return true;
		} else {
			return false;
		}
	}

	public boolean gt(BigDecimal v1, BigDecimal v2) {
		if (v1.compareTo(v2) == 1) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 判断第一个数大于等于第二个数
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean ge(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		if (bd1.compareTo(bd2) >= 0) {
			return true;
		} else {
			return false;
		}
	}

	public boolean ge(BigDecimal v1, BigDecimal v2) {
		if (v1.compareTo(v2) >= 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 判断第一个数小于第二个数
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean lt(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		if (bd1.compareTo(bd2) == -1) {
			return true;
		} else {
			return false;
		}
	}

	public boolean lt(BigDecimal v1, BigDecimal v2) {
		if (v1.compareTo(v2) == -1) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 判断第一个数小于等于第二个数
	 * @param v1
	 * @param v2
	 * @return
	 */
	public boolean le(String v1, String v2) {
		BigDecimal bd1 = new BigDecimal(v1);
		BigDecimal bd2 = new BigDecimal(v2);
		if (bd1.compareTo(bd2) <= 0) {
			return true;
		} else {
			return false;
		}
	}

	public boolean le(BigDecimal v1, BigDecimal v2) {
		if (v1.compareTo(v2) <= 0) {
			return true;
		} else {
			return false;
		}
	}

}
